从数学角度,NumPy数组实现了张量的概念:
| 维度 | 数学名称 | 示例 |
|---|---|---|
| 0维 | 标量(Scalar) | \(5\) |
| 1维 | 向量(Vector) | \([1, 2, 3]\) |
| 2维 | 矩阵(Matrix) | \([[1,2],[3,4]]\) |
| 3维+ | 高维张量 | 时间序列数据立方体 |
对于 \(d\) 维张量 \(\mathbf{A}\),元素索引为 \(\mathbf{A}_{i_1, i_2, \ldots, i_d}\)
| 特性 | NumPy数组 | Python列表 |
|---|---|---|
| 内存布局 | 连续内存块 | 分散的对象引用 |
| 数据类型 | 同构(类型相同) | 异构(可混合) |
| 内存效率 | 紧凑(int32占4字节) | 每个对象约28字节 |
| 计算性能 | 向量化(C层面) | 解释执行(Python层面) |
NumPy快的秘密:向量化运算 + C语言底层实现
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一
import numpy as np #导入NumPy模块并且用英文缩写np
price_amazon= np.array([170.23,170.10,177.59,177.06,178.22]) #直接创建一维数组
type (price_amazon) # 查看price_amazon的数据类型
price_app1e=[221.27,221.72,224.72,226.05,225.89] # 定义列表price_app1e
price_apple=np.array(price_app1e) #将列表转换为一维数组
type(price_apple) # 查看price_apple的数据类型
#任务二
import numpy as np
data1 = [170.23,170.10,177.59,177.06,178.22] # 定义列表data1
data2 = [221.27,221.72,224.72,226.05,225.89] # 定义列表data2
data3 = [413.26,416.11,421.03,418.47,421.53] # 定义列表data3
data4 = [164.16,160.37,161.30,162.96,166.67] # 定义列表data4
data5 = [648.02,661.68,663.22,674.07,688.53] # 定义列表data5
price_array=np.array([data1,data2,data3,data4,data5]) #将以上列表数据创建成数组
print(price_array.shape) #查看数组的形状
print(price_array.ndim) #查看数组的维度
print(price_array.size) #查看数组的元素个数
print(price_array.dtype) #查看数组中的元素类型
#任务三
import numpy as np
price_app1e=[221.27,221.72,224.72,226.05,225.89] # 定义列表price_app1e
n=price_array.size #变量n赋值为数组的元素个数
data1 = [170.23,170.10,177.59,177.06,178.22] # 定义列表data1
data2 = [221.27,221.72,224.72,226.05,225.89] # 定义列表data2
data3 = [413.26,416.11,421.03,418.47,421.53] # 定义列表data3
data4 = [164.16,160.37,161.30,162.96,166.67] # 定义列表data4
data5 = [648.02,661.68,663.22,674.07,688.53] # 定义列表data5
price_array=np.array([data1,data2,data3,data4,data5]) #将以上列表数据创建成数组
n=price_array.size #变量n赋值为数组的元素个数
x=np.arange(n+1) #生成整数序列
m=40 # 设置数组长度参数为40
y=np.linspace(price_apple[0],price_apple[-1],m)#生成起始值是苹果公司股票5月13日收盘价、终止值是5月17日收盘价且元素数量40的等差序列
print(y) # 输出变量y的值
#任务四
import numpy as np
price_app1e=[221.27,221.72,224.72,226.05,225.89] # 定义列表price_app1e
price_amazon=np.array([1822.68,1840,12,1871.15,1907.57,1869.00]) # 创建NumPy数组price_amazon
zero_arrayl=np.zeros_like(price_amazon)#快速生成元素为零的一维数组
zero_array2=np.zeros_like(price_array)#快速生成元素为零的二维数组
one_arrayl=np.ones_like(price_amazon)#快速生成元素等于1的一维数组
one_array2=np.ones_like(price_array) #快速生成元素等于1的二维数组
print(zero_arrayl) # 输出变量zero_arrayl的值
print(zero_array2) # 输出变量zero_array2的值
print(one_arrayl) # 输出变量one_arrayl的值
print(one_array2) # 输出变量one_array2的值(5, 5)
2
25
float64
[221.27 221.38846154 221.50692308 221.62538462 221.74384615
221.86230769 221.98076923 222.09923077 222.21769231 222.33615385
222.45461538 222.57307692 222.69153846 222.81 222.92846154
223.04692308 223.16538462 223.28384615 223.40230769 223.52076923
223.63923077 223.75769231 223.87615385 223.99461538 224.11307692
224.23153846 224.35 224.46846154 224.58692308 224.70538462
224.82384615 224.94230769 225.06076923 225.17923077 225.29769231
225.41615385 225.53461538 225.65307692 225.77153846 225.89 ]
[0. 0. 0. 0. 0. 0.]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[1. 1. 1. 1. 1. 1.]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
arange: [0 1 2 3 4 5 6 7 8 9]
linspace: [0. 0.25 0.5 0.75 1. ]
| 函数 | 参数含义 | 是否包含终止值 |
|---|---|---|
np.arange(start, stop, step) |
指定步长 | 不包含 |
np.linspace(start, stop, num) |
指定元素个数 | 包含 |
float32 比 float64 节省一半内存float64:精度更高,避免累积误差3×4=12 的数组只能重塑为元素总数为12的形状shape 返回元组,表示各维度的大小全0数组(2x3):
[[0. 0. 0.]
[0. 0. 0.]]
全1数组(3x4):
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
单位矩阵(3x3):
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
| 数组 | 函数 | 数学性质 |
|---|---|---|
| 零矩阵 | np.zeros() |
\(O + A = A\) |
| 全1矩阵 | np.ones() |
常用于广播运算 |
| 单位矩阵 | np.eye() |
\(I \cdot A = A \cdot I = A\) |
| 对角矩阵 | np.diag() |
协方差矩阵的简化形式 |
形状 shape: (2, 3)
维度 ndim: 2
元素总数 size: 6
数据类型 dtype: int32
重塑后(3x2):
[[1 2]
[3 4]
[5 6]]
| ndim | 结构 | Python创建方式 |
|---|---|---|
| 0 | 标量 | np.array(5) |
| 1 | 向量 | np.array([1,2,3]) |
| 2 | 矩阵 | np.array([[1,2],[3,4]]) |
| 3 | 张量 | np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) |
axis 参数ravel():性能更好,但注意共享内存flatten():更安全,修改互不影响加法: [5 7 9]
减法: [-3 -3 -3]
乘法: [ 4 10 18]
除法: [0.25 0.4 0.5 ]
幂运算: [1 4 9]
不同形状的数组也可以运算——NumPy自动扩展较小的数组:
* → 元素级(element-wise)@ 或 np.dot() → 矩阵乘法(线性代数)axis=0:沿行方向压缩(对每列操作)axis=1:沿列方向压缩(对每行操作)import numpy as np
# 5个交易日的收盘价
prices = np.array([100, 105, 103, 108, 106])
# 简单收益率:R_t = (P_t - P_{t-1}) / P_{t-1}
simple_returns = (prices[1:] - prices[:-1]) / prices[:-1]
# 对数收益率:r_t = ln(P_t / P_{t-1})
log_returns = np.log(prices[1:] / prices[:-1])
print('简单收益率:')
print(simple_returns)
print('\n对数收益率:')
print(log_returns)简单收益率:
[ 0.05 -0.01904762 0.04854369 -0.01851852]
对数收益率:
[ 0.04879016 -0.01923136 0.04740224 -0.01869213]
| 类型 | 公式 | 特点 |
|---|---|---|
| 简单收益率 | \(R_t = \frac{P_t - P_{t-1}}{P_{t-1}}\) | 直观,但不可跨期相加 |
| 对数收益率 | \(r_t = \ln\frac{P_t}{P_{t-1}}\) | 时间可加性:\(r_{total} = r_1 + r_2\) |
累计收益率:
[0.05 0.03 0.08 0.06]
总收益率: 0.0600
cumprod() 计算累积乘积float64,大数据集可用 float32reshape(-1) 自动推断,用 ravel() 避免复制np.log1p(x) 代替 np.log(1+x) 提高小数值精度[商业大数据分析与应用]